package basededatos;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import org.apache.commons.dbutils.QueryRunner;
import com.mysql.jdbc.PreparedStatement;
import dominio.Avion;
import dominio.Cliente;
import dominio.Hotel;
import dominio.Lugar;
import dominio.Paquete;
import dominio.Piloto;
import dominio.Vuelo;
import excepcion.CantidadFilaColumnaAvionInvalida;
import excepcion.StringVacio;

public class DAO {
	
	public void agregarCliente(Cliente cliente) throws SQLException{
			
			ConexionBD conexion = new ConexionBD();
			QueryRunner run = new QueryRunner();
		
			conexion.Abrir();
			run.update(conexion.getConexion(), "call ClientesInsertar(?, ?, ?, ?, ?)",
												cliente.getDni(),
												cliente.getNombre(),
												cliente.getApellido(),
												cliente.getTelefono(),
												cliente.getEmail());
			conexion.Cerrar();
	}
	
	
	public void agregarAvion(Avion avion) throws SQLException{
		
		ConexionBD conexion = new ConexionBD();
		QueryRunner run = new QueryRunner();
	
		conexion.Abrir();
		run.update(conexion.getConexion(), "call AvionesInsertar(?, ?, ?, ?)",
											avion.getFabricante(),
											avion.getModelo(),
											avion.getCantfilas(),
											avion.getCantcolumnas());
		conexion.Cerrar();
	}
	

	public void agregarPaquete(Paquete paquete) throws SQLException{
		ConexionBD conexion = new ConexionBD();
		QueryRunner run = new QueryRunner();
		
		conexion.Abrir();
			
		run.update(conexion.getConexion(), "call PaquetesInsertar(?, ?, ?)",
											paquete.getIdHotel(),
											paquete.getIdVueloIda(),
											paquete.getIdVueloVuelta());
		conexion.Cerrar();
	}


	public void AgregarVuelo(Vuelo vuelo) throws SQLException{
		ConexionBD conexion = new ConexionBD();
		QueryRunner run = new QueryRunner();
	
		conexion.Abrir();
		run.update(conexion.getConexion(), "call VuelosInsertar(?, ?, ?, ?, ?, ?)",
											vuelo.getAvion().getId(),
											vuelo.getPiloto().getIdentificacion(),
											vuelo.getLugarOrigen().getId(),
											vuelo.getLugarDestino().getId(),
											vuelo.getFechaSalida(),
											vuelo.getPrecio());
		conexion.Cerrar();
	}
	
	public Lugar ConsultarLugarVuelo(int IDVuelo, String tipo) throws SQLException{
		
		Lugar lugar = new Lugar();
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
			preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call Lugar" + tipo + "AveriguarXVuelo(?)");
			preparedStatement.setInt(1, IDVuelo);
	
			rs = preparedStatement.executeQuery();
			
			while(rs.next()){
				lugar.setPais(rs.getString(1));
				lugar.setProvincia(rs.getString(2));
				lugar.setCiudad(rs.getString(3));
			}
		
		conexion.Cerrar();
		
		return lugar;
	}
	
	
	
	public Piloto ConsultarPilotoVuelo(int IDVuelo, String tipo) throws SQLException{
		Piloto piloto = null;
		int id = 0;
		String dni = null;
		String nombre = null;
		String apellido = null;
		String categoria = null;
		Date fechaIngreso = null;
		String email = null;
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
		preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call Piloto" + tipo + "AveriguarXVuelo(?)");
		preparedStatement.setInt(1, IDVuelo);

		rs = preparedStatement.executeQuery();
		
		while(rs.next()){
			id = rs.getInt(1);
			dni = rs.getString(2);
			nombre = rs.getString(3);
			apellido = rs.getString(4);
			categoria = rs.getString(5);
			fechaIngreso = rs.getDate(6);
			email = rs.getString(7);
		}
		
		conexion.Cerrar();
		
		piloto = new Piloto(dni, nombre, apellido, email, fechaIngreso, id, categoria);
		
		return piloto;
	}
	
	
	public Avion ConsultarAvionVuelo(int IDVuelo, String tipo) throws SQLException{
		Avion avion = new Avion();
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
			preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call Avion" + tipo + "AveriguarXVuelo(?)");
			preparedStatement.setInt(1, IDVuelo);
	
			rs = preparedStatement.executeQuery();
			
			while(rs.next()){
				avion.setId(rs.getInt(1));
				
				try {
					avion.setFabricante(rs.getString(2));
					avion.setModelo(rs.getString(3));
					avion.setCantcolumnas(rs.getInt(4));
					avion.setCantfilas(rs.getInt(5));
				} catch (StringVacio e) {
					e.printStackTrace();
				}catch (CantidadFilaColumnaAvionInvalida e) {
					e.printStackTrace();
				}
			}
		
		conexion.Cerrar();
		
		return avion;
	}
	
	public Hotel ConsultarHotel(int IDHotel) throws SQLException{
		
		Lugar lugar = new Lugar();
		Hotel hotel = new Hotel();
		
		ConexionBD conexion = new ConexionBD();
		PreparedStatement preparedStatement = null;
		ResultSet rs = null;
		
		conexion.Abrir();
		
			preparedStatement = (PreparedStatement) conexion.getConexion().prepareStatement("call HotelAveriguarXID(?)");
			preparedStatement.setInt(1, IDHotel);
	
			rs = preparedStatement.executeQuery();
			
			while(rs.next()){
				lugar.setPais(rs.getString(2));
				lugar.setProvincia(rs.getString(3));
				lugar.setCiudad(rs.getString(4));
				hotel.setId(rs.getInt(1));
				hotel.setNombre(rs.getString(5));
				hotel.setDireccion(rs.getString(6));
				hotel.setCategoria(rs.getString(7));
			}		
		hotel.setLugar(lugar);
		
		conexion.Cerrar();
		
		return hotel;
	}
	
}